package cn.gavin.exception;

import cn.gavin.qo.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;

/**
 *  异常统一处理
 *  贴 @ControllerAdvice 注解后，代表该类是对控制器进行增强
*/
@ControllerAdvice // 在一个类贴上 @ControllerAdvice 注解之后，SpringMVC 会自动把这个类用上，就会生效了,还要控制器
public class MyControllerAdvice {
    /**
     * @ExceptionHandler 代表该方法是用于处理某种异常
     */
    @ExceptionHandler(RuntimeException.class)
    public String handler(RuntimeException e, HttpServletResponse response, HandlerMethod method){
        e.printStackTrace(); // 打印异常信息，方便找 bug
        // 需要根据前端请求的方式来响应不同的结果
        // 如果原本是需要返回视图的就可以返回 error 页面
        // 如果原本需要返回 JsonResult,现在也要返回 JsonResult
        if (!method.hasMethodAnnotation(ResponseBody.class)){
            return "common/error"; // 跳转到专门处理异常页面
        } else {
            JsonResult jsonResult = new JsonResult(false, "系统异常，请联系管理员");
            try {
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().println(JSON.toJSONString(jsonResult));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 业务异常走这里
     * @param e 逻辑异常对象
     * @return 返回 JSON 数据
     */
    @ExceptionHandler(LogicException.class)
    @ResponseBody
    public JsonResult handler2(LogicException e){
        return new JsonResult(false,e.getMessage());
    }
}